package com.ys.day29.Reflect.p2反射入口三种;

import java.util.ArrayList;

/**
 * 描述: 入射与反射
 *   反射获取Class 类对象有三种
 *   3种方式不分好坏,一般常用 第1种与第3种
 *
 * @author CodeYang
 * @version 2021/1/11 16:25
 */
public class P1三种加载Class对象的反射方式 {

    public static void main(String[] args) {

        // 1: 第一种方式 获得类对象, 类名称.class class java.util.ArrayList
        Class<ArrayList> classz1 = ArrayList.class;
        // 打印结果: class java.util.ArrayList
        System.out.println(classz1);

        // 2: 第二种 获得类对象,   先创建对象,然后调用对象的 getClass() 方法
        ArrayList<Object> lists = new ArrayList<>(1);
        // ? 无限通配符 ,  extends 又叫 上限继承体系 ? 最高只能是 ArrayList 的 父类. extends 确定 被扩展类的上限父类
        Class<? extends ArrayList> classz2 = lists.getClass();
        // 打印结果 class java.util.ArrayList
        System.out.println(classz2.getClass());

        // 3: 第三种 通过Class.forName("全类名(包名+类名)") 这样可以避免运行时的 类名相同的混肴错误
        try {
            Class<?> classz3 = Class.forName("java.util.ArrayList");
            // 结果: class java.util.ArrayList
            System.out.println(classz3);

            //为什么打印结果都是 class java.util.ArrayList
            // 因为每个类的字节码对象在元空间中,只存在一个class对象 ,所以打印为true
            boolean flag = classz2 == classz3;
            System.out.println(flag);


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
